package app

import (
	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/dialog"
	"fyne.io/fyne/v2/layout"
	"fyne.io/fyne/v2/widget"
	"gitee.com/MM-Q/fastlog"
)

// 全局日志
var appLog *fastlog.FastLog

// 初始化应用程序
func InitApp(log *fastlog.FastLog) fyne.Window {
	// 设置全局日志
	appLog = log

	// 创建一个新的Fyne应用程序
	app := app.NewWithID("QuickBackup")

	// 创建一个新的窗口
	windows := app.NewWindow("QuickBackup")

	// 设置窗口大小
	windows.Resize(fyne.NewSize(600, 450))

	// 设置窗口图标
	ico, err := fyne.LoadResourceFromPath("images/bmt.ico")
	if err != nil {
		appLog.Errorf("加载图标失败: %v", err)
	}
	windows.SetIcon(ico)

	// 初始化UI
	mainTabs := initUI(app, windows)

	// 将标签页添加到窗口中
	windows.SetContent(mainTabs)

	// 返回窗口
	return windows
}

// 初始化UI
func initUI(app fyne.App, windows fyne.Window) fyne.CanvasObject {
	// 创建一个按钮，点击时退出程序
	exitButton := widget.NewButton("点击我退出程序", func() {
		appLog.Info("退出程序...")
		app.Quit() // 调用app.Quit()退出程序
	})

	// 创建退出标签页, 让按钮填充整个标签页
	ExitTab := container.NewTabItem("退出", exitButton) // 添加退出标签页

	// 创建一个根标签页对象
	mainTabs := container.NewAppTabs(
		initHomeUI(windows), // 添加首页标签页
		initTaskUI(windows), // 添加任务管理标签页
		initBackupUI(),      // 添加备份管理标签页
		ExitTab,             // 添加退出标签页
	)

	// 添加关闭窗口事件处理程序
	windows.SetCloseIntercept(func() {
		// 弹出确认对话框
		dialog.ShowConfirm("确认", "确定要退出程序吗？", func(confirm bool) {
			if confirm {
				appLog.Info("退出程序...")
				// 用户点击了确认，关闭窗口
				app.Quit()
			}
		}, windows)
	})

	// 返回根标签页对象
	return mainTabs
}

// 初始化首页界面
func initHomeUI(windows fyne.Window) *container.TabItem {
	// 创建首页文本
	homeText := widget.NewLabel("欢迎使用QuickBackup")

	// 设置文本对齐方式
	homeText.Alignment = fyne.TextAlignCenter

	// 设置文本样式
	homeText.TextStyle = fyne.TextStyle{
		Bold: true, // 加粗
	}

	// 创建底部的水平容器，放置进度条
	progressBar := widget.NewProgressBarInfinite()
	BarContainer := container.New(layout.NewGridLayout(1),
		progressBar,
	)
	// 隐藏进度条
	progressBar.Hidden = true

	// 创建一个水平容器，放置文本
	homeContainer := container.New(layout.NewGridLayout(1), homeText)

	// 创建复选框组
	checkBoxGroup := widget.NewCheckGroup(checkBoxList, func(selected []string) {
		appLog.Debugf("选中的复选框：%v", selected)

		// 覆盖全局变量
		selectedCheckBox = selected
	})
	checkBoxGroup.Horizontal = false // 设置为垂直布局
	// 初始化数据
	updateCheckBoxGroup(checkBoxGroup)

	// 创建顶部的垂直滚动容器
	scrollContainer := container.NewScroll(container.NewVBox(checkBoxGroup))

	// 创建中间的水平容器，放置按钮
	executeButton := widget.NewButton("一键执行", func() {
		// 在这里添加执行备份的逻辑
	})
	executeButton.Importance = widget.HighImportance
	taskButton := widget.NewButton("执行任务", func() {
		// 在这里添加执行任务的逻辑
		executeButtonLogic(windows, progressBar)
	})
	taskButton.Importance = widget.HighImportance

	// 创建一个按钮，点击时刷新复选框组
	refreshButton := widget.NewButton("刷新", func() {
		updateCheckBoxGroup(checkBoxGroup)
	})
	refreshButton.Importance = widget.HighImportance

	// 创建中间的水平容器，放置按钮
	middleContainer := container.New(layout.NewGridLayout(3),
		executeButton,
		taskButton,
		refreshButton,
	)

	// 把按钮和进度条放置在根据行数垂直排列的容器中
	middleAndBottomContainer := container.New(layout.NewGridLayoutWithRows(5),
		middleContainer,    // 顶部按钮水平容器
		homeContainer,      // 中间的文本容器
		layout.NewSpacer(), // 占位符，使按钮和进度条在容器中居中
		layout.NewSpacer(), // 占位符，使按钮和进度条在容器中居中
		BarContainer,       // 底部水平容器
	)

	// 创建一个分割容器，将左右部分分割
	buttonContainer := container.NewHSplit(scrollContainer, middleAndBottomContainer)

	// 设置分割容器的分割位置，这里设置为 0.3，表示顶部容器占据 30% 的高度
	buttonContainer.SetOffset(0.3)

	// 返回包含嵌套标签页的首页标签页
	return container.NewTabItem("首页", buttonContainer)
}

// 初始化任务管理界面
func initTaskUI(windows fyne.Window) *container.TabItem {
	// 初始化数据
	if err := updateTaskData(""); err != nil {
		appLog.Errorf("更新任务数据失败: %v", err)
	}

	// 创建任务管理表格
	taskTable := createTaskTable()

	// 创建一个输入框用于输入任务名称
	taskNameEntry := widget.NewEntry()
	taskNameEntry.SetPlaceHolder("请输入任务名称")

	// 创建一个按钮用于搜索任务
	searchButton := widget.NewButton("搜索", func() {
		// 更新数据源
		if err := updateTaskData(taskNameEntry.Text); err != nil {
			dialog.ShowError(err, windows)
		}
		// 刷新表格数据
		taskTable.Refresh()
	})
	searchButton.Importance = widget.HighImportance

	// 创建一个按钮用于添加任务
	addButton := addTaskButton(windows)
	addButton.Importance = widget.HighImportance

	// 创建一个按钮用于删除任务
	deleteButton := widget.NewButton("删除任务", func() {
		// 删除对话框
		deleteTaskFunc(windows)
		// 更新数据源
		if err := updateTaskData(taskNameEntry.Text); err != nil {
			appLog.Errorf("更新任务数据源失败: %v", err)
			dialog.ShowError(err, windows)
		}
		// 刷新表格数据
		taskTable.Refresh()
	})
	deleteButton.Importance = widget.HighImportance

	// 创建一个按钮用于修改任务
	modifyButton := editTaskButton(windows)
	modifyButton.Importance = widget.HighImportance

	// 创建一个按钮用于刷新任务列表
	refreshButton := widget.NewButton("刷新", func() {
		// 更新数据源
		if err := updateTaskData(""); err != nil {
			appLog.Errorf("更新任务数据源失败: %v", err)
		}
		// 刷新表格数据
		taskTable.Refresh()
	})
	refreshButton.Importance = widget.HighImportance

	// 使用 layout.NewGridLayout 创建网格布局，自动调整组件大小和间距
	inputContainer := container.New(layout.NewGridLayout(6),
		taskNameEntry, // 任务名称输入框
		searchButton,  // 搜索按钮
		addButton,     // 添加按钮
		deleteButton,  // 删除按钮
		modifyButton,  // 修改按钮
		refreshButton, // 刷新按钮
	)

	// 使用 container.NewBorder 创建边框布局容器
	// 顶部放置输入框和按钮的容器，中间放置表格
	taskContainer := container.NewBorder(
		inputContainer, // 顶部容器
		nil,            // 底部容器为空
		nil,            // 左侧容器为空
		nil,            // 右侧容器为空
		taskTable,      // 中间容器为表格
	)

	// 返回一个包含任务管理界面的标签页
	return container.NewTabItem("任务管理", taskContainer)
}

// 初始化备份管理界面
func initBackupUI() *container.TabItem {
	// 初始化数据
	if err := updateBackData(""); err != nil {
		appLog.Errorf("更新备份数据失败: %v", err)
	}

	// 创建备份管理表格
	backupTable := createBackupTable()

	// 创建一个输入框用于输入备份名称
	backupNameEntry := widget.NewEntry()
	backupNameEntry.SetPlaceHolder("请输入备份名称")

	// 创建一个按钮用于搜索备份
	searchButton := widget.NewButton("搜索", func() {
		// 更新数据源
		if err := updateBackData(backupNameEntry.Text); err != nil {
			appLog.Errorf("更新备份数据源失败: %v", err)
		}
		// 刷新表格数据
		backupTable.Refresh()
	})
	searchButton.Importance = widget.HighImportance

	// 创建一个按钮用于删除备份
	deleteButton := widget.NewButton("删除备份", func() {
		// 在这里添加删除备份的逻辑
	})
	deleteButton.Importance = widget.HighImportance

	// 创建一个按钮用于恢复备份
	recoverButton := widget.NewButton("恢复备份", func() {
		// 在这里添加恢复备份的逻辑
	})
	recoverButton.Importance = widget.HighImportance

	// 创建一个按钮用于刷新备份列表
	refreshButton := widget.NewButton("刷新", func() {
		// 更新数据源
		if err := updateBackData(""); err != nil {
			appLog.Errorf("更新备份数据源失败: %v", err)
		}
		// 刷新表格数据
		backupTable.Refresh()
	})
	refreshButton.Importance = widget.HighImportance

	// 使用 layout.NewGridLayout 创建网格布局，自动调整组件大小和间距
	inputContainer := container.New(layout.NewGridLayout(5),
		backupNameEntry, // 备份名称输入框
		searchButton,    // 搜索按钮
		deleteButton,    // 删除按钮
		recoverButton,   // 恢复按钮
		refreshButton,   // 刷新按钮
	)

	// 使用 container.NewBorder 创建边框布局容器
	// 顶部放置输入框和按钮的容器，中间放置表格
	backupContainer := container.NewBorder(
		inputContainer, // 顶部容器
		nil,            // 底部容器为空
		nil,            // 左侧容器为空
		nil,            // 右侧容器为空
		backupTable,    // 中间容器为表格
	)

	// 返回一个包含备份管理界面的标签页
	return container.NewTabItem("备份管理", backupContainer)
}
